import { forEachValue } from '../util';
import Module from './module';

class ModuleCollection {
  constructor(options) {
    this.register([], options); // stack = [根对象, a, c]
  }

  getNameSpaced(path) {
    let { root } = this; // 从根模块找起
    return path.reduce((str, key) => {
      root = root.getChild(key);
      return str + (root.namespaced ? `${key}/` : '');
    }, ''); // 参数就是一个字符串
  }

  register(path, rootModule) {
    const newModule = new Module(rootModule);
    if (path.length === 0) {
      // 根模块
      this.root = newModule;
    } else {
      // [a]
      // [b]
      // [a, c]
      // [a, b, c, d]
      const parent = path.slice(0, -1).reduce((memo, current) => memo.getChild(current), this.root);
      parent.addChild(path[path.length - 1], newModule);
    }

    if (rootModule.modules) {
      // 循环模块
      forEachValue(rootModule.modules, (module, moduleName) => {
        this.register(path.concat(moduleName), module);
      });
    }
  }
}
export default ModuleCollection;

/**
 * this.root = {
 *  _raw: '根模块',
 *  _children: {
 *    _a: {
 *      _raw: "a模块",
 *      _children: {},
 *      state: 'a自己的模块'
 *    },
 *    _b: {
 *      _raw: "b模块",
 *      _children: {},
 *      state: 'b自己的模块'
 *    }
 *  },
 * state: '根模块自己的state',
 *
 * }
 */
